﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using System.Data.SqlClient;
using System.Configuration;
using BE;
using BE.SearchCriteria;

namespace DAL
{
   public class BarrioDAL : BaseDAL 
    {
       public List<BarrioBE> SeleccionarPorParametros(BaseSC pFiltroSC, int pPageSize, int? pPageNum, ref int pCountReg)
       {
           BarrioSC wFiltroSC = (BarrioSC)pFiltroSC;
           if (wFiltroSC == null)
               wFiltroSC = new BarrioSC();

           List<BarrioBE> listaDeBarrioBE = null;
           using (SqlConnection cnn = new SqlConnection(GetConnectionString()))
           {
               SqlCommand cmd = new SqlCommand();
               cmd.Connection = cnn;
               cmd.CommandType = CommandType.StoredProcedure;
               cmd.Parameters.Add(new SqlParameter("@IdBarrio", wFiltroSC.IdBarrio));
               cmd.Parameters.Add(new SqlParameter("@Descripcion", wFiltroSC.Descripcion));
               cmd.Parameters.Add(new SqlParameter("@IdLocalidad", wFiltroSC.IdLocalidad));
               cmd.Parameters.Add(new SqlParameter("@IdProvincia", wFiltroSC.IdProvincia));
               cmd.Parameters.Add(new SqlParameter("@pagesize", pPageSize));
               cmd.Parameters.Add(new SqlParameter("@pagenum", pPageNum));

               SqlParameter p = new SqlParameter();
               p.ParameterName = "@PageCount";
               p.Direction = ParameterDirection.Output;
               p.SqlDbType = SqlDbType.Int;
               cmd.Parameters.Add(p);

               cmd.CommandText = "Barrios_GetAllPaginated";
               cnn.Open();
               SqlDataReader reader = null;
               reader = cmd.ExecuteReader();

               if (reader.HasRows)
               {
                   Int32 idBarrioIndex = reader.GetOrdinal("IdBarrio");
                   Int32 descripcionIndex = reader.GetOrdinal("Descripcion");

                   Int32 idLocalidadIndex = reader.GetOrdinal("IdLocalidad");
                   Int32 localidadIndex = reader.GetOrdinal("Localidad");

                   Int32 idProvinciaIndex = reader.GetOrdinal("IdProvincia");
                   Int32 provinciaIndex = reader.GetOrdinal("Provincia");

                   listaDeBarrioBE = new List<BarrioBE>();

                   while (reader.Read())
                   {
                       BarrioBE oBarrioBE = new BarrioBE();
                       LocalidadBE oLocalidadBE = new LocalidadBE();
                       ProvinciaBE oProvinciaBE = new ProvinciaBE();


                       Object[] values = new Object[reader.FieldCount];
                       reader.GetValues(values);

                       oBarrioBE.IdBarrio = Convert.ToInt32(values[idBarrioIndex]);
                       oBarrioBE.Descripcion = Convert.ToString(values[descripcionIndex]);

                       oLocalidadBE.IdLocalidad = Convert.ToInt32(values[idLocalidadIndex]);
                       oLocalidadBE.Descripcion = Convert.ToString(values[localidadIndex]);

                       oProvinciaBE.IdProvincia = Convert.ToInt32(values[idProvinciaIndex]);
                       oProvinciaBE.Descripcion = Convert.ToString(values[provinciaIndex]);

                       oBarrioBE.pLocalidadBE = oLocalidadBE;
                       oBarrioBE.pLocalidadBE.pProvinciaBE = oProvinciaBE;  
                       
                       listaDeBarrioBE.Add(oBarrioBE);
                   }
               }
               reader.Close();
               pCountReg = (Int32)cmd.Parameters["@PageCount"].Value;

           }
           return listaDeBarrioBE;
       }

       public BarrioBE SeleccionarPorId(BarrioBE oBarrioBE)
       {
           BarrioBE oBarrio = null;
           using (SqlConnection cnn = new SqlConnection(GetConnectionString()))
           {
               SqlCommand cmd = new SqlCommand();
               cmd.Connection = cnn;
               cmd.CommandType = CommandType.StoredProcedure;
               cmd.Parameters.Add(new SqlParameter("@IdBarrio", oBarrioBE.IdBarrio));
               cmd.CommandText = "Barrios_GetById";
               cnn.Open();
               SqlDataReader reader = null;
               reader = cmd.ExecuteReader();

               if (reader.HasRows)
               {
                   Int32 idBarrioIndex = reader.GetOrdinal("IdBarrio");
                   Int32 descripcionIndex = reader.GetOrdinal("Descripcion");
                   Int32 IdLocalidadIndex = reader.GetOrdinal("IdLocalidad");

                   while (reader.Read())
                   {
                       oBarrio = new BarrioBE();
                       LocalidadBE oLocalidadBE = new LocalidadBE(); 

                       Object[] values = new Object[reader.FieldCount];
                       reader.GetValues(values);

                       oBarrio.IdBarrio = Convert.ToInt32(values[idBarrioIndex]);
                       oBarrio.Descripcion = Convert.ToString(values[descripcionIndex]);
                       oLocalidadBE.IdLocalidad = Convert.ToInt32(values[IdLocalidadIndex]);

                       oBarrio.pLocalidadBE = oLocalidadBE; 
                   }
               }

           }
           return oBarrio;
       }

       public void InsertarBarrio(BarrioBE Barrio)
       {
           using (SqlConnection cnn = new SqlConnection(GetConnectionString()))
           {
               try
               {
                   SqlCommand cmd = new SqlCommand();
                   cmd.Connection = cnn;
                   cmd.CommandType = CommandType.StoredProcedure;
                   cmd.CommandText = "Barrios_i";
                   cmd.Parameters.Add(new SqlParameter("@Descripcion", Barrio.Descripcion));
                   cmd.Parameters.Add(new SqlParameter("@IdLocalidad", Barrio.pLocalidadBE.IdLocalidad));

                   SqlParameter p = new SqlParameter();
                   p.ParameterName = "@IdBarrio";
                   p.Direction = ParameterDirection.Output;
                   p.SqlDbType = SqlDbType.Int;
                   cmd.Parameters.Add(p);

                   cnn.Open();
                   cmd.ExecuteNonQuery();
                   Barrio.IdBarrio = (Int32)cmd.Parameters["@IdBarrio"].Value;
               }
               catch (Exception)
               {
                   throw;
               }

           }
       }

       public void ModificarBarrio(BarrioBE pBarrio)
       {
           try
           {
               using (SqlConnection cnn = new SqlConnection(GetConnectionString()))
               {
                   SqlCommand cmd = new SqlCommand();
                   cmd.Connection = cnn;
                   cmd.CommandType = CommandType.StoredProcedure;
                   cmd.CommandText = "Barrios_u";
                   cmd.Parameters.Add(new SqlParameter("@IdBarrio", pBarrio.IdBarrio));
                   cmd.Parameters.Add(new SqlParameter("@Descripcion", pBarrio.Descripcion));
                   cmd.Parameters.Add(new SqlParameter("@IdLocalidad", pBarrio.pLocalidadBE.IdLocalidad));
                   cnn.Open();
                   cmd.ExecuteNonQuery();
               }
           }
           catch (Exception)
           { throw; }
       }

       public void DeleteBarrio(BarrioBE pBarrio)
       {
           try
           {
               using (SqlConnection cnn = new SqlConnection(GetConnectionString()))
               {
                   SqlCommand cmd = new SqlCommand();
                   cmd.Connection = cnn;
                   cmd.CommandType = CommandType.StoredProcedure;
                   cmd.CommandText = "Barrios_d";
                   cmd.Parameters.Add(new SqlParameter("@IdBarrio", pBarrio.IdBarrio));
                   cnn.Open();
                   cmd.ExecuteNonQuery();
               }
           }
           catch (Exception)
           { throw; }
       }
    }
}
